package coneccion;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;

import mapeo.CandidatosMapper;
import mapeo.EstudiantesMapper;

import objetos.Candidato;
import objetos.Estudiante;

import utils.Constantes;
import utils.CreadorDeCodigosVotacion;
import utils.UtilidadesConexion;

public class EstudiantesConsultas {
	
	public EstudiantesConsultas() {
		super();
	}

	/**
	 * Realiza una consulta a la base de datos, filtrando por apellido, legajo tipo y numero de documento del estudiante. Ademas permite limitar el numero de resultados, primerResultado admite valores desde 0 a n-1.
	 * @param estudiante
	 * @param primerResultado
	 * @param cantidadResultados
	 * @return
	 */
	public List<Estudiante> getEstudiantesList(Estudiante estudiante, Integer primerResultado, Integer cantidadResultados){
		
		List<Estudiante> resultList = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT e.estudiantes_id as estudiantes_id, ")
				.append("e.estudiantes_nombres as estudiantes_nombres, ")
				.append("e.estudiantes_apellidos as estudiantes_apellidos, ")
				.append("e.estudiantes_legajo as estudiantes_legajo, ")
				.append("td.tipos_documentos_id as tipos_documentos_id, ")
				.append("td.tipos_documentos_nombre as tipos_documentos_nombre, ")
				.append("td.tipos_documentos_nombre_completo as tipos_documentos_nombre_completo, ")
				.append("e.estudiantes_numero_documento as estudiantes_numero_documento, ")
				.append("e.estudiantes_codigo_votacion as estudiantes_codigo_votacion, ")
				.append("e.estudiantes_estado_voto as estudiantes_estado_voto, ")
				.append("e.estudiantes_numero_mesa as estudiantes_numero_mesa ");
			
			query.append("FROM estudiantes e, tipos_documentos td ");
			query.append("WHERE  e.estudiantes_tipo_documento=td.tipos_documentos_id ");
			
			if(estudiante != null){
				
				if(estudiante.getApellidos() != null && estudiante.getApellidos().length()>0){
					query.append("AND e.estudiantes_apellidos LIKE '" + estudiante.getApellidos() + "%' ");
					
				}
				if(estudiante.getLegajo() != null && estudiante.getLegajo().length()>0){
					query.append("AND e.estudiantes_legajo='" + estudiante.getLegajo() + "' ");
				}
				if(estudiante.getDocumentoIdentidad() != null ){
					if(estudiante.getDocumentoIdentidad().getId() != null && estudiante.getDocumentoIdentidad().getId().intValue()>0){
						query.append("AND e.estudiantes_tipo_documento=" + estudiante.getDocumentoIdentidad().getId() + " ");
					}					
				}
				
				if(estudiante.getNumeroDocumento() != null && estudiante.getNumeroDocumento().length()>0){
					query.append("AND e.estudiantes_numero_documento='" + estudiante.getNumeroDocumento() + "' ");
				}
			}
			
			query.append("ORDER BY e.estudiantes_apellidos ASC, e.estudiantes_legajo ASC, e.estudiantes_tipo_documento ASC, e.estudiantes_numero_documento ASC ");
			
			if(primerResultado != null && cantidadResultados!=null){
				if(primerResultado.intValue()==0 && cantidadResultados.intValue()>0){
					query.append("LIMIT ").append(cantidadResultados).append(" ");
				}else if(primerResultado.intValue()>0 && cantidadResultados.intValue()>0){
					query.append("LIMIT ").append(primerResultado).append(", ").append(cantidadResultados).append(" ");
				}
			}
			
			
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			EstudiantesMapper estudiantesMapper = new EstudiantesMapper();
			resultList = estudiantesMapper.parseListaEstudiante(rs);
			
		} catch (NamingException e) {
			e.printStackTrace();
			resultList = new ArrayList<Estudiante>();
		} catch (SQLException e) {
			e.printStackTrace();
			resultList = new ArrayList<Estudiante>();
		} catch (Exception e) {
			e.printStackTrace();
			resultList = new ArrayList<Estudiante>();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return resultList;
		
	}
	
	
public Integer getCantidadEstudiantes(Estudiante estudiante){
		
		Integer result = Integer.valueOf(0); 
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");		
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT count(*) as cantidad ");
			
			query.append("FROM estudiantes e, tipos_documentos td ");
			query.append("WHERE  e.estudiantes_tipo_documento=td.tipos_documentos_id ");
			
			if(estudiante != null){
				
				if(estudiante.getApellidos() != null && estudiante.getApellidos().length()>0){
					query.append("AND e.estudiantes_apellidos LIKE '" + estudiante.getApellidos() + "%' ");
					
				}
				if(estudiante.getLegajo() != null && estudiante.getLegajo().length()>0){
					query.append("AND e.estudiantes_legajo='" + estudiante.getLegajo() + "' ");
				}
				if(estudiante.getDocumentoIdentidad() != null ){
					if(estudiante.getDocumentoIdentidad().getId() != null && estudiante.getDocumentoIdentidad().getId().intValue()>0){
						query.append("AND e.estudiantes_tipo_documento=" + estudiante.getDocumentoIdentidad().getId() + " ");
					}					
				}
				
				if(estudiante.getNumeroDocumento() != null && estudiante.getNumeroDocumento().length()>0){
					query.append("AND e.estudiantes_numero_documento='" + estudiante.getNumeroDocumento() + "' ");
				}
			}
			
			//query.append("ORDER BY e.estudiantes_apellidos ASC, e.estudiantes_legajo ASC, e.estudiantes_tipo_documento ASC, e.estudiantes_numero_documento ASC ");
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			if(rs.next()){
				result = rs.getInt("cantidad") ;
			}
		} catch (NamingException e) {
			e.printStackTrace();
			result = Integer.valueOf(0); 
		} catch (SQLException e) {
			e.printStackTrace();
			result = Integer.valueOf(0);
		} catch (Exception e) {
			e.printStackTrace();
			result = Integer.valueOf(0);
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
		
	}


	public Estudiante getEstudiante(Estudiante estudianteBusqueda){
		Estudiante result = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT e.estudiantes_id as estudiantes_id, ")
				.append("e.estudiantes_nombres as estudiantes_nombres, ")
				.append("e.estudiantes_apellidos as estudiantes_apellidos, ")
				.append("e.estudiantes_legajo as estudiantes_legajo, ")
				.append("td.tipos_documentos_id as tipos_documentos_id, ")
				.append("td.tipos_documentos_nombre as tipos_documentos_nombre, ")
				.append("td.tipos_documentos_nombre_completo as tipos_documentos_nombre_completo, ")
				.append("e.estudiantes_numero_documento as estudiantes_numero_documento, ")
				.append("e.estudiantes_codigo_votacion as estudiantes_codigo_votacion, ")
				.append("e.estudiantes_estado_voto as estudiantes_estado_voto, ")
				.append("e.estudiantes_numero_mesa as estudiantes_numero_mesa ");
			
			query.append("FROM estudiantes e, tipos_documentos td ");
			query.append("WHERE  e.estudiantes_tipo_documento=td.tipos_documentos_id ");
			
			if(estudianteBusqueda != null){
				
				if(estudianteBusqueda.getId() != null && estudianteBusqueda.getId().intValue()>0){
					query.append("AND e.estudiantes_id=" + estudianteBusqueda.getId() + " ");
				}
				
				if(estudianteBusqueda.getApellidos() != null && estudianteBusqueda.getApellidos().length()>0){
					query.append("AND e.estudiantes_apellidos LIKE '" + estudianteBusqueda.getApellidos() + "%' ");
					
				}
				if(estudianteBusqueda.getLegajo() != null && estudianteBusqueda.getLegajo().length()>0){
					query.append("AND e.estudiantes_legajo='" + estudianteBusqueda.getLegajo() + "' ");
				}
				if(estudianteBusqueda.getDocumentoIdentidad() != null ){
					if(estudianteBusqueda.getDocumentoIdentidad().getId() != null && estudianteBusqueda.getDocumentoIdentidad().getId().intValue()>0){
						query.append("AND e.estudiantes_tipo_documento=" + estudianteBusqueda.getDocumentoIdentidad().getId() + " ");
					}					
				}
				
				if(estudianteBusqueda.getCodigoVotacion() != null && estudianteBusqueda.getCodigoVotacion().length()>0){
					query.append("AND e.estudiantes_codigo_votacion='" + estudianteBusqueda.getCodigoVotacion() + "' ");
				}
				
				if(estudianteBusqueda.getNumeroDocumento() != null && estudianteBusqueda.getNumeroDocumento().length()>0){
					query.append("AND e.estudiantes_numero_documento='" + estudianteBusqueda.getNumeroDocumento() + "' ");
				}
			}
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			EstudiantesMapper estudiantesMapper = new EstudiantesMapper();
			result = estudiantesMapper.parseEstudiante(rs);
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = new Estudiante();
		} catch (SQLException e) {
			e.printStackTrace();
			result = new Estudiante();
		} catch (Exception e) {
			e.printStackTrace();
			result = new Estudiante();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
	}
	
	public Estudiante getEstudianteParaVotar(Estudiante estudianteBusqueda){
		Estudiante result = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT e.estudiantes_id as estudiantes_id, ")
				.append("e.estudiantes_nombres as estudiantes_nombres, ")
				.append("e.estudiantes_apellidos as estudiantes_apellidos, ")
				.append("e.estudiantes_legajo as estudiantes_legajo, ")
				.append("td.tipos_documentos_id as tipos_documentos_id, ")
				.append("td.tipos_documentos_nombre as tipos_documentos_nombre, ")
				.append("td.tipos_documentos_nombre_completo as tipos_documentos_nombre_completo, ")
				.append("e.estudiantes_numero_documento as estudiantes_numero_documento, ")
				.append("e.estudiantes_codigo_votacion as estudiantes_codigo_votacion, ")
				.append("e.estudiantes_estado_voto as estudiantes_estado_voto, ")
				.append("e.estudiantes_numero_mesa as estudiantes_numero_mesa ");
			
			query.append("FROM estudiantes e, tipos_documentos td ");
			query.append("WHERE  e.estudiantes_tipo_documento=td.tipos_documentos_id ");
			
			if(estudianteBusqueda != null){
				
				query.append("AND e.estudiantes_legajo='" + estudianteBusqueda.getLegajo() + "' ");
				query.append("AND e.estudiantes_tipo_documento=").append(estudianteBusqueda.getDocumentoIdentidad().getId()).append(" ");
				query.append("AND e.estudiantes_codigo_votacion='" + estudianteBusqueda.getCodigoVotacion() + "' ");
				query.append("AND e.estudiantes_numero_documento='" + estudianteBusqueda.getNumeroDocumento() + "' ");
				
			}
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			EstudiantesMapper estudiantesMapper = new EstudiantesMapper();
			result = estudiantesMapper.parseEstudiante(rs);
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = new Estudiante();
		} catch (SQLException e) {
			e.printStackTrace();
			result = new Estudiante();
		} catch (Exception e) {
			e.printStackTrace();
			result = new Estudiante();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
	}
	
	public Estudiante getEstudianteParaHabilitarVotacion(Estudiante estudianteBusqueda){
		Estudiante result = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT e.estudiantes_id as estudiantes_id, ")
				.append("e.estudiantes_nombres as estudiantes_nombres, ")
				.append("e.estudiantes_apellidos as estudiantes_apellidos, ")
				.append("e.estudiantes_legajo as estudiantes_legajo, ")
				.append("td.tipos_documentos_id as tipos_documentos_id, ")
				.append("td.tipos_documentos_nombre as tipos_documentos_nombre, ")
				.append("td.tipos_documentos_nombre_completo as tipos_documentos_nombre_completo, ")
				.append("e.estudiantes_numero_documento as estudiantes_numero_documento, ")
				.append("e.estudiantes_codigo_votacion as estudiantes_codigo_votacion, ")
				.append("e.estudiantes_estado_voto as estudiantes_estado_voto, ")
				.append("e.estudiantes_numero_mesa as estudiantes_numero_mesa ");
			
			query.append("FROM estudiantes e, tipos_documentos td ");
			query.append("WHERE  e.estudiantes_tipo_documento=td.tipos_documentos_id ");
			
			if(estudianteBusqueda != null){
				
				query.append("AND e.estudiantes_legajo='" + estudianteBusqueda.getLegajo() + "' ");
				query.append("AND e.estudiantes_tipo_documento=").append(estudianteBusqueda.getDocumentoIdentidad().getId()).append(" ");
				query.append("AND e.estudiantes_numero_documento='" + estudianteBusqueda.getNumeroDocumento() + "' ");
				
			}
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			EstudiantesMapper estudiantesMapper = new EstudiantesMapper();
			result = estudiantesMapper.parseEstudiante(rs);
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = new Estudiante();
		} catch (SQLException e) {
			e.printStackTrace();
			result = new Estudiante();
		} catch (Exception e) {
			e.printStackTrace();
			result = new Estudiante();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
	}
	
public List<Estudiante> getEstudiantesPorMesa(Integer numeroMesa, Integer primerResultado, Integer cantidadResultados){
		
		List<Estudiante> resultList = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT e.estudiantes_id as estudiantes_id, ")
				.append("e.estudiantes_nombres as estudiantes_nombres, ")
				.append("e.estudiantes_apellidos as estudiantes_apellidos, ")
				.append("e.estudiantes_legajo as estudiantes_legajo, ")
				.append("td.tipos_documentos_id as tipos_documentos_id, ")
				.append("td.tipos_documentos_nombre as tipos_documentos_nombre, ")
				.append("td.tipos_documentos_nombre_completo as tipos_documentos_nombre_completo, ")
				.append("e.estudiantes_numero_documento as estudiantes_numero_documento, ")
				.append("e.estudiantes_codigo_votacion as estudiantes_codigo_votacion, ")
				.append("e.estudiantes_estado_voto as estudiantes_estado_voto, ")
				.append("e.estudiantes_numero_mesa as estudiantes_numero_mesa ");
			
			query.append("FROM estudiantes e, tipos_documentos td ");
			query.append("WHERE  e.estudiantes_tipo_documento=td.tipos_documentos_id ");
			query.append("AND e.estudiantes_numero_mesa=").append(numeroMesa).append(" ");
			
			query.append("ORDER BY e.estudiantes_apellidos ASC, e.estudiantes_legajo ASC, e.estudiantes_tipo_documento ASC, e.estudiantes_numero_documento ASC ");
			
			if(primerResultado != null && cantidadResultados!=null){
				if(primerResultado.intValue()==0 && cantidadResultados.intValue()>0){
					query.append("LIMIT ").append(cantidadResultados).append(" ");
				}else if(primerResultado.intValue()>0 && cantidadResultados.intValue()>0){
					query.append("LIMIT ").append(primerResultado).append(", ").append(cantidadResultados).append(" ");
				}
			}
			
			
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			EstudiantesMapper estudiantesMapper = new EstudiantesMapper();
			resultList = estudiantesMapper.parseListaEstudiante(rs);
			
		} catch (NamingException e) {
			e.printStackTrace();
			resultList = new ArrayList<Estudiante>();
		} catch (SQLException e) {
			e.printStackTrace();
			resultList = new ArrayList<Estudiante>();
		} catch (Exception e) {
			e.printStackTrace();
			resultList = new ArrayList<Estudiante>();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return resultList;
		
	}
	public Integer getCantidadEstudiantesPorMesa(Integer numeroMesa){
		
		Integer result = Integer.valueOf(0); 
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");		
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT count(*) as cantidad ");
			
			query.append("FROM estudiantes e, tipos_documentos td ");
			query.append("WHERE  e.estudiantes_tipo_documento=td.tipos_documentos_id ");
			query.append("AND e.estudiantes_numero_mesa=").append(numeroMesa).append(" ");
			//query.append("ORDER BY e.estudiantes_apellidos ASC, e.estudiantes_legajo ASC, e.estudiantes_tipo_documento ASC, e.estudiantes_numero_documento ASC ");
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			if(rs.next()){
				result = rs.getInt("cantidad") ;
			}
		} catch (NamingException e) {
			e.printStackTrace();
			result = Integer.valueOf(0); 
		} catch (SQLException e) {
			e.printStackTrace();
			result = Integer.valueOf(0);
		} catch (Exception e) {
			e.printStackTrace();
			result = Integer.valueOf(0);
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
		
	}
	public Boolean agregarEstudiante(Estudiante estudiante){
		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		PropiedadesSistemaConsultas propiedadesSistemaConsultas = new PropiedadesSistemaConsultas();
		String estadoVotacion = propiedadesSistemaConsultas.getEstadoVotacion();
		if(Constantes.ESTADO_VOTACION_PREPARACION.equals(estadoVotacion)){
			try {
				//creo la coneccion y la sentencia
				con = UtilidadesConexion.getConnectionFromTomcatPool();
				con.setAutoCommit(true);
				stmt = con.createStatement();
				
				query.append("INSERT INTO estudiantes (estudiantes_nombres, estudiantes_apellidos, estudiantes_legajo, estudiantes_tipo_documento, estudiantes_numero_documento, estudiantes_estado_voto)");
				query.append("VALUES ( ")
					.append("'").append(estudiante.getNombres()).append("', ")
					.append("'").append(estudiante.getApellidos()).append("', ")
					.append("'").append(estudiante.getLegajo()).append("', ")
					.append(estudiante.getDocumentoIdentidad().getId().toString()).append(", ")
					.append("'").append(estudiante.getNumeroDocumento()).append("', ")
					.append("0").append(" )");
				
				//ejecuto el update
				stmt.executeUpdate(query.toString(), Statement.RETURN_GENERATED_KEYS);
				rs = stmt.getGeneratedKeys();
				
				if(rs!=null && rs.next()){
					estudiante.setId(rs.getInt(1));
				}
				
				result = Boolean.TRUE;
				
			} catch (NamingException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch (SQLException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch(Exception e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			}finally {
				
			    if (stmt != null) {
			      try { 
			    	  	stmt.close();
			    	  } catch (SQLException e) {
			    		  
			    	  }
			      stmt = null;
			    }
				if(con!=null){
					try {
						con.close();
					} catch (SQLException e) {
						
					}
					con = null;
				}
			}
		}
		return result;
	}
	
	public Boolean actualizarEstudiante(Estudiante estudiante){
		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			query.append("UPDATE estudiantes ")
				.append("SET estudiantes_nombres='").append(estudiante.getNombres()).append("', ")
				.append("estudiantes_apellidos='").append(estudiante.getApellidos()).append("', ")
				.append("estudiantes_legajo='").append(estudiante.getLegajo()).append("', ")
				.append("estudiantes_tipo_documento=").append(estudiante.getDocumentoIdentidad().getId().toString()).append(", ")
				.append("estudiantes_numero_documento='").append(estudiante.getNumeroDocumento()).append("' ");
				
			query.append("WHERE estudiantes_id=").append(estudiante.getId().toString());
			//ejecuto el update
			stmt.executeUpdate(query.toString());
			
			result = Boolean.TRUE;
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch (SQLException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch(Exception e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		}finally {
			
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
	}
	
	public Boolean eliminarEstudiante(Estudiante estudiante){
		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		
		PropiedadesSistemaConsultas propiedadesSistemaConsultas = new PropiedadesSistemaConsultas();
		String estadoVotacion = propiedadesSistemaConsultas.getEstadoVotacion();
		if(Constantes.ESTADO_VOTACION_PREPARACION.equals(estadoVotacion)){
		
			try {
				//creo la coneccion y la sentencia
				con = UtilidadesConexion.getConnectionFromTomcatPool();
				con.setAutoCommit(true);
				stmt = con.createStatement();
				
				query.append("DELETE FROM estudiantes ");
				query.append("WHERE estudiantes_id=").append(estudiante.getId().toString());
				//ejecuto el update
				stmt.executeUpdate(query.toString());
				
				result = Boolean.TRUE;
				
			} catch (NamingException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch (SQLException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch(Exception e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			}finally {
				
			    if (stmt != null) {
			      try { 
			    	  	stmt.close();
			    	  } catch (SQLException e) {
			    		  
			    	  }
			      stmt = null;
			    }
				if(con!=null){
					try {
						con.close();
					} catch (SQLException e) {
						
					}
					con = null;
				}
			}
		}
		return result;
	}
	
	public Boolean crearCodigovotacion(Integer id){
		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			if(id!=null && id.intValue()>0){
				CreadorDeCodigosVotacion creadorDeCodigosVotacion = new CreadorDeCodigosVotacion();
				String codigoVotacion = creadorDeCodigosVotacion.crearCodigoVotacion();
				con = UtilidadesConexion.getConnectionFromTomcatPool();
				con.setAutoCommit(true);
				stmt = con.createStatement();
				
				query.append("UPDATE estudiantes ")
					.append("SET estudiantes_codigo_votacion='").append(codigoVotacion.trim()).append("' ");
					
				query.append("WHERE estudiantes_id=").append(id);
				//ejecuto el update
				stmt.executeUpdate(query.toString());
				
				result = Boolean.TRUE;
			}
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch (SQLException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch(Exception e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		}finally {
			
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
	}
	
	
	public synchronized static Boolean votar(Estudiante estudiante, Candidato candidato){
		Boolean result = Boolean.FALSE;
		Connection con = null;
		try {
			//creo la coneccion y  un punto de restauracion en la base de datos
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(false);
			PropiedadesSistemaConsultas propiedadesSistemaConsultas = new PropiedadesSistemaConsultas();
			String estadoVotacion = propiedadesSistemaConsultas.getEstadoVotacion();
			if(Constantes.ESTADO_VOTACION_INICIADA.equals(estadoVotacion)){
				
				if(estudiante!=null && estudiante.getId()!=null && candidato!=null && candidato.getId()!= null){		
						//result = resetearEstudiantes && limpiarMesas && agregarMesas && asignarVotantesMesas && resetearVotos && votacionIniciada;
						if(EstudiantesConsultas.votanteHabilitado(estudiante.getId())){
							
							Candidato candidatoVotar = EstudiantesConsultas.getCandidatoParaVotar(candidato.getId());
							
							Boolean votoSumado = EstudiantesConsultas.actualizarCandidato(candidatoVotar, con);
							Boolean votoRealizadoEstudiante = EstudiantesConsultas.setVotoRealizadoEstudiante(estudiante, con);
							
							result = votoSumado && votoRealizadoEstudiante;
							
							if(result){
								con.commit();
							}else{
								try {
									if(con!=null ){
										con.rollback();
									}
								} catch (SQLException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}
							}
						}
				}
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
			//rollback a la transaccion
			try {
				if(con!=null ){
					con.rollback();
				}
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			result = Boolean.FALSE;
		} catch (Exception e) {
			e.printStackTrace();
			//rollback a la transaccion
			try {
				if(con!=null ){
					con.rollback();
				}
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} 
			result = Boolean.FALSE;
		} finally {
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		return result;
	}
	
	private synchronized static Boolean votanteHabilitado(Integer id){
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		Boolean result = Boolean.FALSE;
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT e.estudiantes_estado_voto as estudiantes_estado_voto ");
			
			query.append("FROM estudiantes e ");
			query.append("WHERE  e.estudiantes_id=").append(id).append(" ");
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			if(rs!=null && rs.first()){
				result = rs.getInt("estudiantes_estado_voto") == 0;
			}
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch (SQLException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch (Exception e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result ;
	}
	
	
	private synchronized static Candidato getCandidatoParaVotar(Integer id){
		Candidato result = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT e.candidatos_id as candidatos_id, ")
			.append("e.candidatos_nombres as candidatos_nombres, ")
			.append("e.candidatos_apellidos as candidatos_apellidos, ")
			.append("e.candidatos_foto_candidato as candidatos_foto_candidato, ")
			.append("td.tipos_documentos_id as tipos_documentos_id, ")
			.append("td.tipos_documentos_nombre as tipos_documentos_nombre, ")
			.append("td.tipos_documentos_nombre_completo as tipos_documentos_nombre_completo, ")
			.append("e.candidatos_numero_documento as candidatos_numero_documento, ")
			.append("e.candidatos_partido_politico as candidatos_partido_politico, ")
			.append("e.candidatos_foto_partido_politico as candidatos_foto_partido_politico, ")
			.append("e.candidatos_votos as candidatos_votos ");
		
			query.append("FROM candidatos e, tipos_documentos td ");
			query.append("WHERE  e.candidatos_tipo_documento=td.tipos_documentos_id ");
			query.append("AND e.candidatos_id=" + id + " ");
				
		
			
			//ejecuto la consulta y guardo el resultado en el resultset
			rs = stmt.executeQuery(query.toString());
			
			CandidatosMapper candidatosMapper = new CandidatosMapper();
			result = candidatosMapper.parseCandidato(rs);
			
		} catch (NamingException e) {
			e.printStackTrace();
			result = new Candidato();
		} catch (SQLException e) {
			e.printStackTrace();
			result = new Candidato();
		} catch (Exception e) {
			e.printStackTrace();
			result = new Candidato();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return result;
	}
	
	
	private static synchronized Boolean actualizarCandidato(Candidato candidato, Connection con){
		Boolean result = Boolean.FALSE;
		
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		//el candidato voto en blanco no se puede modificar
		if( candidato!=null && candidato.getId()!=null && candidato.getId().intValue()!=1){
			try {
				//creo la coneccion y la sentencia
				stmt = con.createStatement();
				int cantidadVotos = candidato.getCantidadVotos().intValue()+1;
				query.append("UPDATE candidatos ")
					.append("SET candidatos_votos=").append(cantidadVotos).append(" ");
				query.append("WHERE candidatos_id=").append(candidato.getId().toString());
				//ejecuto el update
				stmt.executeUpdate(query.toString());
				
				result = Boolean.TRUE;
				
			} catch (SQLException e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			} catch(Exception e) {
				e.printStackTrace();
				result = Boolean.FALSE;
			}finally {
				
			    if (stmt != null) {
			      try { 
			    	  	stmt.close();
			    	  } catch (SQLException e) {
			    		  
			    	  }
			      stmt = null;
			    }
			}
		}
		return result;
	}
	
	
	private synchronized static Boolean setVotoRealizadoEstudiante(Estudiante estudiante, Connection con){
		Boolean result = Boolean.FALSE;
		
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		
		try {
			//creo la coneccion y la sentencia
			stmt = con.createStatement();
			
			query.append("UPDATE estudiantes ")
				.append("SET estudiantes_estado_voto=").append(1).append(" ");
				
			query.append("WHERE estudiantes_id=").append(estudiante.getId().toString());
			//ejecuto el update
			stmt.executeUpdate(query.toString());
			
			result = Boolean.TRUE;
			
		}  catch (SQLException e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		} catch(Exception e) {
			e.printStackTrace();
			result = Boolean.FALSE;
		}finally {
			
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
		}
		
		return result;
	}
}


